/*
@title: Sprig Machine
@description: Sprig Machine is a sandbox-style puzzle game where players manipulate various types of cells to solve levels. The game includes elements like Movers, Generators, Rotators, Push cells, and Enemies, each with specific behaviors and interactions. Inspired by Cell Machine Mystic Mod, the objective is to strategically combine these elements to overcome obstacles and progress through the game.
@author: Leonard (Omay)
@tags: ['sandbox']
@addedOn: 2022-10-21

WASD to move selection
I: select
J: start/stop sim
K: step sim/proceed to next level
L: reset sim

While running, you can't pick up anything. Press L to restart so you can play it.

The Movers (Blue) move in the direction they face.
The Generators (Green) copy the block behind them, and put the in front of them.
The Clockwise Rotators (Orange) rotate all adjacent blocks clockwise.
The Counter-Clockwise Rotators (Light Blue) rotate all adjacent blocks counter-clockwise
The Push cells (Yellow like #) can get pushed anywhere
The Slide cells (Yellow like =) can get pushed in the direction their lines go
The Enemies (Red) destroy any cell that goes into the same tile as them, as well as themselves
The Trashes (Purple) destroy any cell that goes into the same tile as them, but not themselves
The Walls (Gray) can't be moved. Can be generated though.

Walkthrough: https://www.youtube.com/watch?v=KRSk3fpyM1M
Video by Fullo.
All levels by Sam Hogan, Mystic and Snazz.
Inspired by Cell Machine Mystic Mod.
*/
//Confiuration START
const stepTime = 250;
//Configuration END

//Sprite Stuff START
const mover = "abcd".split('');
const gen = "efgh".split('');
const rotcw = "ijkl".split('');
const rotccw = "mnop".split('');
const push = "qrst".split('');
const slide = "uvwx".split('');
const enemy = "yz01".split('');
const immob = "2345".split('');
const trash = "^&*(".split('');
const mover2 = "ABCD".split('');
const gen2 = "EFGH".split('');
const rotcw2 = "IJKL".split('');
const rotccw2 = "MNOP".split('');
const push2 = "QRST".split('');
const slide2 = "UVWX".split('');
const enemy2 = "YZ)!".split('');
const immob2 = "@#$%".split('');
const trash2 = ")-_=".split('');
const bg = "6";
const bgp = "7";
const bgm = "8";
const sel = "9";
setLegend(
  [sel, bitmap`
2222222222222222
2222........2222
22............22
22............22
2..............2
2..............2
2..............2
2..............2
2..............2
2..............2
2..............2
2..............2
22............22
22............22
2222........2222
2222222222222222`],
  [mover2[0], bitmap`
0055555555555500
0555555555555550
5555555555555555
5555555555555555
5555555225555555
5555555225555555
5555552222555555
5555552222555555
5555522222255555
5555522222255555
5555222222225555
5555222222225555
5555555555555555
5555555555555555
0555555555555550
0055555555555500`],
  [mover2[1], bitmap`
0055555555555500
0555555555555550
5555555555555555
5555555555555555
5555225555555555
5555222255555555
5555222222555555
5555222222225555
5555222222225555
5555222222555555
5555222255555555
5555225555555555
5555555555555555
5555555555555555
0555555555555550
0055555555555500`],
  [mover2[2], bitmap`
0055555555555500
0555555555555550
5555555555555555
5555555555555555
5555222222225555
5555222222225555
5555522222255555
5555522222255555
5555552222555555
5555552222555555
5555555225555555
5555555225555555
5555555555555555
5555555555555555
0555555555555550
0055555555555500`],
  [mover2[3], bitmap`
0055555555555500
0555555555555550
5555555555555555
5555555555555555
5555555555225555
5555555522225555
5555552222225555
5555222222225555
5555222222225555
5555552222225555
5555555522225555
5555555555225555
5555555555555555
5555555555555555
0555555555555550
0055555555555500`],
  [gen2[0], bitmap`
0044444444444400
0444444444444440
4444444444444444
4444444224444444
4444442222444444
4444422222244444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444222222224444
4444444444444444
4444444444444444
0444444444444440
0044444444444400`],
  [gen2[1], bitmap`
0044444444444400
0444444444444440
4444444444444444
4444444444444444
4442444444444444
4442444444244444
4442444444224444
4442222222222444
4442222222222444
4442444444224444
4442444444244444
4442444444444444
4444444444444444
4444444444444444
0444444444444440
0044444444444400`],
  [gen2[2], bitmap`
0044444444444400
0444444444444440
4444444444444444
4444444444444444
4444222222224444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444422222244444
4444442222444444
4444444224444444
4444444444444444
0444444444444440
0044444444444400`],
  [gen2[3], bitmap`
0044444444444400
0444444444444440
4444444444444444
4444444444444444
4444444444424444
4444424444424444
4444224444424444
4442222222224444
4442222222224444
4444224444424444
4444424444424444
4444444444424444
4444444444444444
4444444444444444
0444444444444440
0044444444444400`],
  [rotcw2[0], bitmap`
0000999999990000
0099999999999990
0999999999999990
0999999229999990
9999922222299999
9999229999229299
9999229999929299
9999999992222999
9992222999999999
9929299999229999
9929229999229999
9999922222299999
0999999229999990
0999999999999990
0099999999999900
0000999999990000`],
  [rotcw2[1], bitmap`
0000999999990000
0099999999999900
0999922999999990
0999999299999990
9999922292299999
9999229292229999
9999299299929999
9992299999922999
9992299999922999
9999299929929999
9999222929229999
9999922922299999
0999999929999990
0999999992299990
0099999999999900
0000999999990000`],
  [rotcw2[2], bitmap`
0000999999990000
0099999999999990
0999999999999990
0999999229999990
9999922222299999
9999229999229299
9999229999929299
9999999992222999
9992222999999999
9929299999229999
9929229999229999
9999922222299999
0999999229999990
0999999999999990
0099999999999900
0000999999990000`],
  [rotcw2[3], bitmap`
0000999999990000
0099999999999900
0999922999999990
0999999299999990
9999922292299999
9999229292229999
9999299299929999
9992299999922999
9992299999922999
9999299929929999
9999222929229999
9999922922299999
0999999929999990
0999999992299990
0099999999999900
0000999999990000`],
  [rotccw2[0], bitmap`
0000777777770000
0077777777777770
0777777777777770
0777777227777770
7777722222277777
7727227777227777
7727277777227777
7772222777777777
7777777772222777
7777227777727277
7777227777227277
7777722222277777
0777777227777770
0777777777777770
0077777777777700
0000777777770000`],
  [rotccw2[1], bitmap`
0000777777770000
0077777777777700
0777777772277770
0777777727777770
7777722722277777
7777222727227777
7777277727727777
7772277777722777
7772277777722777
7777277277727777
7777227272227777
7777722272277777
0777777277777770
0777722777777770
0077777777777700
0000777777770000`],
  [rotccw2[2], bitmap`
0000777777770000
0077777777777770
0777777777777770
0777777227777770
7777722222277777
7727227777227777
7727277777227777
7772222777777777
7777777772222777
7777227777727277
7777227777227277
7777722222277777
0777777227777770
0777777777777770
0077777777777700
0000777777770000`],
  [rotccw2[3], bitmap`
0000777777770000
0077777777777700
0777777772277770
0777777727777770
7777722722277777
7777222727227777
7777277727727777
7772277777722777
7772277777722777
7777277277727777
7777227272227777
7777722272277777
0777777277777770
0777722777777770
0077777777777700
0000777777770000`],
  [push2[0], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [push2[1], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [push2[2], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [push2[3], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [slide2[0], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [slide2[1], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6666666666666666
0666666666666660
0066666666666600`],
  [slide2[2], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666666666666666
0666666666666660
0066666666666600`],
  [slide2[3], bitmap`
0066666666666600
0666666666666660
6666666666666666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6666666666666666
0666666666666660
0066666666666600`],
  [enemy2[0], bitmap`
0033333333333300
0333333333333330
3333333333333333
3333333333333333
3300003333000033
3300003333000033
3330033333300333
3330033333300333
3333333333333333
3333330000333333
3333300330033333
3333003333003333
3333033333303333
3333033333303333
0333333333333330
0033333333333300`],
  [enemy2[1], bitmap`
0033333333333300
0333333333333330
3333333333333333
3333333333003333
3300033300003333
3333003300003333
3333300333003333
3333330333333333
3333330333333333
3333300333003333
3333003300003333
3300033300003333
3333333333003333
3333333333333333
0333333333333330
0033333333333300`],
  [enemy2[2], bitmap`
0033333333333300
0333333333333330
3333033333303333
3333033333303333
3333003333003333
3333300330033333
3333330000333333
3333333333333333
3333003333003333
3333003333003333
3330000330000333
3330000330000333
3333333333333333
3333333333333333
0333333333333330
0033333333333300`],
  [enemy2[3], bitmap`
0033333333333300
0333333333333330
3333333333333333
3333003333333333
3333000033300033
3333000033003333
3333003330033333
3333333330333333
3333333330333333
3333003330033333
3333000033003333
3333000033300033
3333003333333333
3333333333333333
0333333333333330
0033333333333300`],
  [immob2[0], bitmap`
................
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
................`],
  [immob2[1], bitmap`
................
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
................`],
  [immob2[2], bitmap`
................
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
................`],
  [immob2[3], bitmap`
................
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.L0LLLLLLLLLL0L.
.LLLLLLLLLLLLLL.
.L0L0LLLLLL0L0L.
.LLLLLLLLLLLLLL.
................`],
  [trash2[0], bitmap`
0HHHHHHHHHHHHHH0
HHHHHHH22HHHHHHH
HH222222222222HH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHHH22222222HHHH
0HHHHHHHHHHHHHH0`],
  [trash2[1], bitmap`
0HHHHHHHHHHHHHH0
HHHHHHHHHHHHHHHH
HHHHHHHHHHHHH2HH
HH222222222222HH
H2HHHHHHHHHHH2HH
H2HHHHHHHHHHH2HH
H2222222222222HH
H2HHHHHHHHHHH22H
H2HHHHHHHHHHH22H
H2222222222222HH
H2HHHHHHHHHHH2HH
H2HHHHHHHHHHH2HH
HH222222222222HH
HHHHHHHHHHHHH2HH
HHHHHHHHHHHHHHHH
0HHHHHHHHHHHHHH0`],
  [trash2[2], bitmap`
0HHHHHHHHHHHHHH0
HHHH22222222HHHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HH222222222222HH
HHHHHHH22HHHHHHH
0HHHHHHHHHHHHHH0`],
  [trash2[3], bitmap`
0HHHHHHHHHHHHHH0
HHHHHHHHHHHHHHHH
HH2HHHHHHHHHHHHH
HH222222222222HH
HH2HHHHHHHHHHH2H
HH2HHHHHHHHHHH2H
HH2222222222222H
H22HHHHHHHHHHH2H
H22HHHHHHHHHHH2H
HH2222222222222H
HH2HHHHHHHHHHH2H
HH2HHHHHHHHHHH2H
HH222222222222HH
HH2HHHHHHHHHHHHH
HHHHHHHHHHHHHHHH
0HHHHHHHHHHHHHH0`],
  [mover[0], bitmap`
..555555555555..
.55555555555555.
5555555555555555
5555555555555555
5555555225555555
5555555225555555
5555552222555555
5555552222555555
5555522222255555
5555522222255555
5555222222225555
5555222222225555
5555555555555555
5555555555555555
.55555555555555.
..555555555555..`],
  [mover[1], bitmap`
..555555555555..
.55555555555555.
5555555555555555
5555555555555555
5555225555555555
5555222255555555
5555222222555555
5555222222225555
5555222222225555
5555222222555555
5555222255555555
5555225555555555
5555555555555555
5555555555555555
.55555555555555.
..555555555555..`],
  [mover[2], bitmap`
..555555555555..
.55555555555555.
5555555555555555
5555555555555555
5555222222225555
5555222222225555
5555522222255555
5555522222255555
5555552222555555
5555552222555555
5555555225555555
5555555225555555
5555555555555555
5555555555555555
.55555555555555.
..555555555555..`],
  [mover[3], bitmap`
..555555555555..
.55555555555555.
5555555555555555
5555555555555555
5555555555225555
5555555522225555
5555552222225555
5555222222225555
5555222222225555
5555552222225555
5555555522225555
5555555555225555
5555555555555555
5555555555555555
.55555555555555.
..555555555555..`],
  [gen[0], bitmap`
..444444444444..
.44444444444444.
4444444444444444
4444444224444444
4444442222444444
4444422222244444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444222222224444
4444444444444444
4444444444444444
.44444444444444.
..444444444444..`],
  [gen[1], bitmap`
..444444444444..
.44444444444444.
4444444444444444
4444444444444444
4442444444444444
4442444444244444
4442444444224444
4442222222222444
4442222222222444
4442444444224444
4442444444244444
4442444444444444
4444444444444444
4444444444444444
.44444444444444.
..444444444444..`],
  [gen[2], bitmap`
..444444444444..
.44444444444444.
4444444444444444
4444444444444444
4444222222224444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444444224444444
4444422222244444
4444442222444444
4444444224444444
4444444444444444
.44444444444444.
..444444444444..`],
  [gen[3], bitmap`
..444444444444..
.44444444444444.
4444444444444444
4444444444444444
4444444444424444
4444424444424444
4444224444424444
4442222222224444
4442222222224444
4444224444424444
4444424444424444
4444444444424444
4444444444444444
4444444444444444
.44444444444444.
..444444444444..`],
  [rotcw[0], bitmap`
....99999999....
..9999999999999.
.99999999999999.
.99999922999999.
9999922222299999
9999229999229299
9999229999929299
9999999992222999
9992222999999999
9929299999229999
9929229999229999
9999922222299999
.99999922999999.
.99999999999999.
..999999999999..
....99999999....`],
  [rotcw[1], bitmap`
....99999999....
..999999999999..
.99992299999999.
.99999929999999.
9999922292299999
9999229292229999
9999299299929999
9992299999922999
9992299999922999
9999299929929999
9999222929229999
9999922922299999
.99999992999999.
.99999999229999.
..999999999999..
....99999999....`],
  [rotcw[2], bitmap`
....99999999....
..9999999999999.
.99999999999999.
.99999922999999.
9999922222299999
9999229999229299
9999229999929299
9999999992222999
9992222999999999
9929299999229999
9929229999229999
9999922222299999
.99999922999999.
.99999999999999.
..999999999999..
....99999999....`],
  [rotcw[3], bitmap`
....99999999....
..999999999999..
.99992299999999.
.99999929999999.
9999922292299999
9999229292229999
9999299299929999
9992299999922999
9992299999922999
9999299929929999
9999222929229999
9999922922299999
.99999992999999.
.99999999229999.
..999999999999..
....99999999....`],
  [rotccw[0], bitmap`
....77777777....
..7777777777777.
.77777777777777.
.77777722777777.
7777722222277777
7727227777227777
7727277777227777
7772222777777777
7777777772222777
7777227777727277
7777227777227277
7777722222277777
.77777722777777.
.77777777777777.
..777777777777..
....77777777....`],
  [rotccw[1], bitmap`
....77777777....
..777777777777..
.77777777227777.
.77777772777777.
7777722722277777
7777222727227777
7777277727727777
7772277777722777
7772277777722777
7777277277727777
7777227272227777
7777722272277777
.77777727777777.
.77772277777777.
..777777777777..
....77777777....`],
  [rotccw[2], bitmap`
....77777777....
..7777777777777.
.77777777777777.
.77777722777777.
7777722222277777
7727227777227777
7727277777227777
7772222777777777
7777777772222777
7777227777727277
7777227777227277
7777722222277777
.77777722777777.
.77777777777777.
..777777777777..
....77777777....`],
  [rotccw[3], bitmap`
....77777777....
..777777777777..
.77777777227777.
.77777772777777.
7777722722277777
7777222727227777
7777277727727777
7772277777722777
7772277777722777
7777277277727777
7777227272227777
7777722272277777
.77777727777777.
.77772277777777.
..777777777777..
....77777777....`],
  [push[0], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [push[1], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [push[2], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [push[3], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6662222222222666
6662222222222666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [slide[0], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [slide[1], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6666666666666666
.66666666666666.
..666666666666..`],
  [slide[2], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666622662266666
6666666666666666
.66666666666666.
..666666666666..`],
  [slide[3], bitmap`
..666666666666..
.66666666666666.
6666666666666666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6662222222222666
6662222222222666
6666666666666666
6666666666666666
6666666666666666
.66666666666666.
..666666666666..`],
  [enemy[0], bitmap`
..333333333333..
.33333333333333.
3333333333333333
3333333333333333
3300003333000033
3300003333000033
3330033333300333
3330033333300333
3333333333333333
3333330000333333
3333300330033333
3333003333003333
3333033333303333
3333033333303333
.33333333333333.
..333333333333..`],
  [enemy[1], bitmap`
..333333333333..
.33333333333333.
3333333333333333
3333333333003333
3300033300003333
3333003300003333
3333300333003333
3333330333333333
3333330333333333
3333300333003333
3333003300003333
3300033300003333
3333333333003333
3333333333333333
.33333333333333.
..333333333333..`],
  [enemy[2], bitmap`
..333333333333..
.33333333333333.
3333033333303333
3333033333303333
3333003333003333
3333300330033333
3333330000333333
3333333333333333
3333003333003333
3333003333003333
3330000330000333
3330000330000333
3333333333333333
3333333333333333
.33333333333333.
..333333333333..`],
  [enemy[3], bitmap`
..333333333333..
.33333333333333.
3333333333333333
3333003333333333
3333000033300033
3333000033003333
3333003330033333
3333333330333333
3333333330333333
3333003330033333
3333000033003333
3333000033300033
3333003333333333
3333333333333333
.33333333333333.
..333333333333..`],
  [immob[0], bitmap`
0000000000000000
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0000000000000000`],
  [immob[1], bitmap`
0000000000000000
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0000000000000000`],
  [immob[2], bitmap`
0000000000000000
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0000000000000000`],
  [immob[3], bitmap`
0000000000000000
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0LLLLLLLLLLLLLL0
0L0LLLLLLLLLL0L0
0LLLLLLLLLLLLLL0
0L0L0LLLLLL0L0L0
0LLLLLLLLLLLLLL0
0000000000000000`],
  [trash[0], bitmap`
.HHHHHHHHHHHHHH.
HHHHHHH22HHHHHHH
HH222222222222HH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHHH22222222HHHH
.HHHHHHHHHHHHHH.`],
  [trash[1], bitmap`
.HHHHHHHHHHHHHH.
HHHHHHHHHHHHHHHH
HHHHHHHHHHHHH2HH
HH222222222222HH
H2HHHHHHHHHHH2HH
H2HHHHHHHHHHH2HH
H2222222222222HH
H2HHHHHHHHHHH22H
H2HHHHHHHHHHH22H
H2222222222222HH
H2HHHHHHHHHHH2HH
H2HHHHHHHHHHH2HH
HH222222222222HH
HHHHHHHHHHHHH2HH
HHHHHHHHHHHHHHHH
.HHHHHHHHHHHHHH.`],
  [trash[2], bitmap`
.HHHHHHHHHHHHHH.
HHHH22222222HHHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HHH2HH2HH2HH2HHH
HH222222222222HH
HHHHHHH22HHHHHHH
.HHHHHHHHHHHHHH.`],
  [trash[3], bitmap`
.HHHHHHHHHHHHHH.
HHHHHHHHHHHHHHHH
HH2HHHHHHHHHHHHH
HH222222222222HH
HH2HHHHHHHHHHH2H
HH2HHHHHHHHHHH2H
HH2222222222222H
H22HHHHHHHHHHH2H
H22HHHHHHHHHHH2H
HH2222222222222H
HH2HHHHHHHHHHH2H
HH2HHHHHHHHHHH2H
HH222222222222HH
HH2HHHHHHHHHHHHH
HHHHHHHHHHHHHHHH
.HHHHHHHHHHHHHH.`],
  [bg, bitmap`
................
....LLLLLLLL....
..LLLLLLLLLLLL..
..LLLLLLLLLLLL..
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
.LLLLLLLLLLLLLL.
..LLLLLLLLLLLL..
..LLLLLLLLLLLL..
....LLLLLLLL....
................`],
  [bgp, bitmap`
................
....11111111....
..111111111111..
..111111111111..
.11111111111111.
.111111LL111111.
.111111LL111111.
.1111LLLLLL1111.
.1111LLLLLL1111.
.111111LL111111.
.111111LL111111.
.11111111111111.
..111111111111..
..111111111111..
....11111111....
................`],
  [bgm, bitmap`
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000`]
);
const solids = mover.concat(gen.concat(rotcw.concat(rotccw.concat(push.concat(slide.concat(immob))))));
const pushables = mover.concat(gen.concat(rotcw.concat(rotccw.concat(push.concat(slide)))));
setSolids(solids);
setPushables({
  [mover[0]]: pushables,
  [mover[1]]: pushables,
  [mover[2]]: pushables,
  [mover[3]]: pushables,
  [gen[0]]: pushables,
  [gen[1]]: pushables,
  [gen[2]]: pushables,
  [gen[3]]: pushables,
  [rotcw[0]]: pushables,
  [rotcw[1]]: pushables,
  [rotcw[2]]: pushables,
  [rotcw[3]]: pushables,
  [rotccw[0]]: pushables,
  [rotccw[1]]: pushables,
  [rotccw[2]]: pushables,
  [rotccw[3]]: pushables,
  [push[0]]: pushables,
  [push[1]]: pushables,
  [push[2]]: pushables,
  [push[3]]: pushables,
  [slide[0]]: pushables,
  [slide[1]]: pushables,
  [slide[2]]: pushables,
  [slide[3]]: pushables
});
//Sprite Stuff END

//Music Stuff START
const move = tune`
30,
30: d4-30 + c4-30,
900`;
const destroy = tune`
100: d4-100 + c4-100 + f4-100 + e4-100 + g4-100,
3100`;
const music = tune`
250,
250: b4^250,
250: a4^250,
250,
250: e4^250,
500,
250: g4^250 + c4^250,
750,
250: a4^250,
750,
250: c4^250 + e4^250,
250,
250: b4^250,
250: a4^250,
250,
250: e4^250,
500,
250: c4^250 + g4^250,
500,
250: e4^250,
250: c5^250,
250: f5^250,
250: g4^250,
250,
250: c4^250`;
playTune(music, Infinity);
//Music Stuff END

//Level Stuff START
var level = 0;
const levels = [
  map`
2222222222
2........2
2.b......2
2........2
2......y.2
2........2
2222222222`,
  map`
222222222222
2..........2
2......yyy.2
2..........2
2.b........2
2..........2
2.q........2
2q.........2
222222222222`,
  map`
2222222222
2........2
2...a....2
2......y.2
2.i......2
2........2
2222222222`,
  map`
222222222222
2..........2
2..q....yyy2
2.f........2
222222222222`,
  map`
222222222222222
2q...c..c.....2
2......q......2
2.............2
2.............2
2.............2
2.............2
2.bw........yy2
2.............2
222222222222222`,
  map`
2222222222
2........2
2......y.2
2...g....2
2......y.2
2.b......2
2222222222`,
  map`
22222222222222
2.....22222222
2w....22222222
2.qq..22222222
2.b..c22222222
2..c..22222222
2.....22222222
2.....22222222
2............2
2............2
2..........y.2
2............2
22222222222222`,
  map`
22222222222222222
2...............2
2.......y.......2
2...............2
2...............2
2...............2
2...............2
2...............2
2.y....q........2
2............q..2
2.yy...e.dq...q.2
2.......q.q.q...2
22222222222222222`,
  map`
22222222222222222222
2..v.c.c...........2
2..i...............2
2..................2
2..................2
2bqiiiii...........2
2..................2
2..................2
2..................2
2........y.........2
2..................2
22222222222222222222`,
  map`
222222222222222
2.............2
2......f......2
2..y.w......y.2
2........2....2
2.......h.....2
222222222222222`,
  map`
222222222222222
2...a.........2
2.............2
2.2........y..2
2..........y..2
2.a........y..2
2..........y..2
2...2.........2
2.............2
2....a........2
2.a.au........2
2.............2
2.i...........2
222222222222222`,
  map`
22222222222222222
2.......q.......2
2...............2
2........i......2
2yyyyy.f...yyyyy2
2........2......2
2........2......2
2......q........2
22222222222222222`,
  map`
22222222222222222222
2..c.b.............2
2..x...............2
2..................2
2.b................2
2...f..............2
2..................2
2..................2
2vf................2
2..................2
2.........yyyyyyyy.2
2..................2
2..................2
22222222222222222222`,
  map`
222222222222222
22222222yyyyyy2
22222222yyyyyy2
22222222yyyyyy2
22222222yyyyyy2
22222222yyyyyy2
22222222......2
22222222......2
2f.qe.........2
2f............2
2.2...........2
2.............2
222222222222222`,
  map`
22222222222222222222222
2.....................2
2.....................2
2.....................2
2.......yyyyyyyyyyyy..2
2.....................2
2.ibi....e.....q....xx2
2..b.........q...g..xx2
2.....................2
2.......yyyyyyyyyyyy..2
2.....................2
2.....................2
2.....................2
22222222222222222222222`,
  map`
222222222222
2..........2
2..y.......2
2..........2
2.q.qv.....2
2..m.d.....2
2f........y2
2..........2
222222222222`,
  map`
22222222222222222222
2ffg.h.............2
2..................2
2..................2
2..................2
2..................2
22222222222........2
22222222222........2
22222222222........2
22222222222........2
22222222222........2
2yyyyyyy...........2
2yyyyyyy...........2
2yyyyyyy...........2
2yyyyyyy...........2
22222222222222222222`,
  map`
2222222222222222
2yyyyyy.....q.m2
2.....be....2..2
2..............2
2..b..........m2
2222222222222222`,
  map`
22222222222
2.mm...ii.2
2...d.....2
2.........2
2..g......2
2.........2
^.........^
2..y...y..2
2..y...y..2
2..y...y..2
2..y...y..2
2.........2
22222222222`,
  map`
222222222
2.......2
2...y.m.2
2.a.y.m.2
2.......2
222222222`,
  map`
2222222^2^2222222
2a.mii.u.u......2
2......u.u......2
2......u.u.yyyy.2
2bb....u.u......2
2...qq.u.u......2
2222222^2^2222222`,
  map`
222222222222222
2.c....y..y..y2
2..me..y..y..y2
2......y..y..y2
2c............2
2.............2
2.............2
222222222222222`,
  map`
..2222..
...22...
..2y.2..
.2....2.
2......2
2...k..2
2......2
2.b2...2
2..a...2
2...q..2
2..i...2
2......2
2...y..2
2...y..2
22..y.22
.222222.`,
  map`
22222.2.2
2...2.2.2
2.y.2.2..
2.y.2.222
2.y.2....
2...22222
2.......2
2....ii.2
2....ii.2
2..f....2
2.......2
2.......2
2.......2
222...222
..2.a.2..
2.2...2.2
2.22222.2`,
  map`
.....222222222.....
.222.2......y2.222.
.2.222bbbbbbb222.2.
.222.2.......2.222.
..2..2...c...2..2..
..2..2...c...2..2..
..2..2...c...2..2..
..2..2...c...2..2..
222222.......222222
2ya.............ay2
2.a....m...m....a.2
2.a.............a.2
2.a.............a.2
2.a.............a.2
2.a....m...m....a.2
2.a.............a.2
222222.......222222
..2..2.......2..2..
.222.2.......2.222.
.2.222bbbbbbb222.2.
.222.2......y2.222.
.....222222222.....`,
  map`
2222222222222
2...........2
2.k...c.c.c.2
2.....q.e...2
2....2.2.2..2
2...........2
2...........2
2...........2
2...b.......2
2.k.........2
2...........2
22222.......2
2.2.2.y.y.y.2
.2.22.y.y.y.2
2.2.2.......2
.2.2222222222`,
  map`
22222222222
2.........2
2..b...i..2
2.........2
2..2...2..2
2...222...2
2.........2
2222...2222
...2.y.2...
...2.y.2...
2222.y.2222
2mm2.y.2ii2
2..2.y.2..2
2.af.2.h.c2
2..22222..2
2mm2...2ii2
2222...2222`,
  map`
......22222...
......2...2...
......2.y.2...
......2.y.2...
2222222.y.2222
2.......y....2
2bei.yyyy...i2
2............2
2.b..........2
2......i.2..i2
2............2
22222222222222`,
  map`
................
......k.......k.
................
..k2q......22...
...2gqqqqqqhq...
....q.....yq.m..
....qy.y...q....
.k..q....y.q....
....q...y.yq....
....q.y....q.a..
....q..y...q....
.k.qfqqqqqqe2...
...22......q2...
....k...........
.........k......
................`,
  map`
22222222222.....
2m........22....
2..........22222
2....yy........2
2....yy........2
2....yy........2
2....yy........2
2.............m2
2.............q2
2..............2
2m......e.uvq..2
2222...........2
...22..aaaaaaa.2
....222222222222`
];
const addLevels = [
  map`
..........
.77776666.
.77776666.
.77776666.
.77776666.
.77776666.
..........`,
  map`
............
.7777766666.
.7777766666.
.7777766666.
.7777766666.
.7777766666.
.7777766666.
.7777766666.
............`,
  map`
..........
.77776666.
.77776666.
.77776666.
.77776666.
.77776666.
..........`,
  map`
............
.7777666666.
.7777666666.
.7777666666.
............`,
  map`
...............
.7777777777666.
.7777777777666.
.7777777777666.
.6666666666666.
.6666666666666.
.6666666666666.
.6666666666666.
.6666666666666.
...............`,
  map`
..........
.77776666.
.77776666.
.77776666.
.77776666.
.77776666.
..........`,
  map`
..............
.77777........
.77777........
.77777........
.77777........
.77777........
.77777........
.66666........
.666666666666.
.666666666666.
.666666666666.
.666666666666.
..............`,
  map`
.................
.666666666666666.
.666666666666666.
.666666666666666.
.666666666666666.
.666666666666666.
.666666666666666.
.666666666666666.
.666666777777777.
.666666777777777.
.666666777777777.
.666666777777777.
.................`,
  map`
....................
.777777777777777777.
.777777777777777777.
.777777777777777777.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
....................`,
  map`
...............
.6666777776666.
.6666777776666.
.6666777776666.
.6666777776666.
.6666777776666.
...............`,
  map`
...............
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
...............`,
  map`
.................
.666666777666666.
.666666777666666.
.666666777666666.
.666666777666666.
.666666777666666.
.666666777666666.
.666666777666666.
.................`,
  map`
....................
.777777666666666666.
.777777666666666666.
.777777666666666666.
.777777666666666666.
.777777666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
....................`,
  map`
...............
........666666.
........666666.
........666666.
........666666.
........666666.
........666666.
........666666.
.7777766666666.
.7777766666666.
.7777766666666.
.7777766666666.
...............`,
  map`
.......................
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.777777777777777777777.
.777777777777777777777.
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.666666666666666666666.
.......................`,
  map`
............
.6666666666.
.6666666666.
.6666666666.
.7777777766.
.7777777766.
.7777777766.
.7777777766.
............`,
  map`
....................
.777776666666666666.
.777776666666666666.
.777776666666666666.
.777776666666666666.
.777776666666666666.
...........66666666.
...........66666666.
...........66666666.
...........66666666.
...........66666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
.666666666666666666.
....................`,
  map`
................
.66666666667777.
.66666666667777.
.77777777777777.
.77777777777777.
................`,
  map`
...........
.777777777.
.777777777.
.777777777.
.777777777.
.777777777.
.666666666.
.666666666.
.666666666.
.666666666.
.666666666.
.666666666.
...........`,
  map`
.........
.7776777.
.7776777.
.7776777.
.7776777.
.........`,
  map`
.................
.777776666666666.
.777776666666666.
.777776666666666.
.777776666666666.
.777776666666666.
.................`,
  map`
...............
.7777666666666.
.7777666666666.
.7777666666666.
.7777666666666.
.7777666666666.
.6666666666666.
...............`,
  map`
........
........
...66...
..6666..
.666666.
.666666.
.666666.
.777777.
.777777.
.777777.
.777777.
.777777.
.666666.
.666666.
..6666..
........`,
  map`
.........
.666.....
.666.....
.666.....
.666.....
.666.....
.7777777.
.7777777.
.7777777.
.7777777.
.7777777.
.7777777.
.7777777.
...666...
...666...
...666...
.........`,
  map`
...................
......6666666......
......6666666......
......6666666......
......6666666......
......6666666......
......6666666......
......6666666......
......6666666......
.66666777677766666.
.66666777677766666.
.66666777677766666.
.66666777677766666.
.66666777677766666.
.66666777677766666.
.66666777677766666.
......6666666......
......6666666......
......6666666......
......6666666......
......6666666......
...................`,
  map`
.............
.77777777777.
.77777777777.
.77777777777.
.77776666666.
.77776666666.
.77776666666.
.77776666666.
.77776666666.
.77776666666.
.77776666666.
.....6666666.
.....6666666.
.....6666666.
.....6666666.
.............`,
  map`
...........
.777777777.
.777777777.
.777777777.
.777777777.
.777777777.
.777777777.
....666....
....666....
....666....
....666....
.66.666.66.
.66.666.66.
.6666.6666.
.66.....66.
.66.....66.
...........`,
  map`
..............
.......666....
.......666....
.......666....
.......666....
.777766666666.
.777766666666.
.777766666666.
.777766666666.
.777766666666.
.777766666666.
..............`,
  map`
7777777777777777
7777777777777777
7777777777777777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7776666666666777
7777777777777777
7777777777777777
7777777777777777`,
  map`
................
.666666666......
.6666666666.....
.66666666666676.
.66666666666676.
.66666666666676.
.66666666666676.
.66666666666676.
.66666666666676.
.66666677777776.
.66666677777776.
....66677777776.
.....6677777776.
................`
];
const selMap = map`
9`;
function addMap(mapa){
  mapa = mapa.split("\n");
  for(var i = 0; i < mapa.length; i++){
    for(var j = 0; j < mapa[i].length; j++){
      if(mapa[i].charAt(j) !== "."){
        addSprite(j, i-1, mapa[i].charAt(j));
      }
    }
  }
};
setMap(levels[level]);
addMap(addLevels[level]);
addMap(selMap);
setBackground(bgm);
//Level Stuff END

//Simulation START
var tTimeout;
var running = false;
const noUp = [slide[1], slide[3]];
const noRight = [slide[0], slide[2]];
const noDown = [slide[1], slide[3]];
const noLeft = [slide[0], slide[2]];
function checkMove(moving, dir){
  if(dir === "up"){
    var goal = getTile(moving.x, moving.y-1).map(x => x.type);
    for(var i = 0; i < goal.length; i++){
      if(noUp.includes(goal[i])){
        return false;
      }
    }
    return true;
  }else if(dir === "right"){
    var goal = getTile(moving.x+1, moving.y).map(x => x.type);
    for(var i = 0; i < goal.length; i++){
      if(noRight.includes(goal[i])){
        return false;
      }
    }
    return true;
  }else if(dir === "down"){
    var goal = getTile(moving.x, moving.y+1).map(x => x.type);
    for(var i = 0; i < goal.length; i++){
      if(noDown.includes(goal[i])){
        return false;
      }
    }
    return true;
  }else if(dir === "left"){
    var goal = getTile(moving.x-1, moving.y).map(x => x.type);
    for(var i = 0; i < goal.length; i++){
      if(noLeft.includes(goal[i])){
        return false;
      }
    }
    return true;
  }
}
function mod(n, m) {
  return n - (m * (n/m | 0));
}
function checkPassive(){
  var mutable = "abcdefghijklmnopqrstuvwxyz012345^&*(";
  var movable = "abcdefghijklmnopqrstuvwxyz01";
  //Enemys
  var liveenemys = getAll(enemy[0]).concat(getAll(enemy[1])).concat(getAll(enemy[2])).concat(getAll(enemy[3]));
  for(var i = 0; i < liveenemys.length; i++){
    var curenemy = getTile(liveenemys[i].x, liveenemys[i].y);
    var curenemytypes = curenemy.map(x => x.type);
    if(curenemytypes.includes(sel)){
      if(curenemy.length > 3){
        playTune(destroy);
        liveenemys = getAll(enemy[0]).concat(getAll(enemy[1])).concat(getAll(enemy[2])).concat(getAll(enemy[3]));
        for(var j = 0; j < curenemytypes.length; j++){
          if(mutable.includes(curenemytypes[j])){
            curenemy[j].remove();
          }
        }
      }
    }else{
      if(curenemy.length > 2){
        playTune(destroy);
        liveenemys = getAll(enemy[0]).concat(getAll(enemy[1])).concat(getAll(enemy[2])).concat(getAll(enemy[3]));
        for(var j = 0; j < curenemytypes.length; j++){
          if(mutable.includes(curenemytypes[j])){
            curenemy[j].remove();
          }
        }
      }
    }
  }
  //Trash
  var trashes = getAll(trash[0]).concat(getAll(trash[1])).concat(getAll(trash[2])).concat(getAll(trash[3]));
  for(var i = 0; i < trashes.length; i++){
    var curTrash = getTile(trashes[i].x, trashes[i].y);
    for(var j = 0; j < curTrash.length; j++){
      if(movable.includes(curTrash[j].type)){
        playTune(destroy);
        curTrash[j].remove();
      }
    }
  }
}
function step(){
  running = true;
  var mutable = "abcdefghijklmnopqrstuvwxyz012345^&*(";
  var movable = "abcdefghijklmnopqrstuvwxyz01";
  //Generators
  var genws = getAll(gen[0]);
  var gends = getAll(gen[1]);
  var genss = getAll(gen[2]);
  var genas = getAll(gen[3]);
  for(var i = 0; i < gends.length; i++){
    var tileb = getTile(gends[i].x-1, gends[i].y);
    var tilef = getTile(gends[i].x+1, gends[i].y);
    var tilebt = tileb.map(x => x.type);
    var tileft = tilef.map(x => x.type);
    if(tilef.length < 4 && tileft.includes(sel) || tilef.length < 3 && !tileft.includes(sel)){
      for(var j = 0; j < tileb.length; j++){
        if(mutable.includes(tilebt[j])){
          for(var k = 0; k < tilef.length; k++){
            if(movable.includes(tileft[k]) && checkMove(tilef[k], "right") && !(tileft.includes("y") || tileft.includes("z") || tileft.includes("0") || tileft.includes("1"))){
              tilef[k].x++;
            }
          }
          if(tilef.length < 3 && (tileft.includes(bgp) || tileft.includes(bg)) || tileft.includes("y") || tileft.includes("z") || tileft.includes("0") || tileft.includes("1")){
            addSprite(gends[i].x+1, gends[i].y, tilebt[j]);
          }
        }
      }
    }
  }
  checkPassive();
  for(var i = 0; i < genas.length; i++){
    var tileb = getTile(genas[i].x+1, genas[i].y);
    var tilef = getTile(genas[i].x-1, genas[i].y);
    var tilebt = tileb.map(x => x.type);
    var tileft = tilef.map(x => x.type);
    if(tilef.length < 4 && tileft.includes(sel) || tilef.length < 3 && !tileft.includes(sel)){
      for(var j = 0; j < tileb.length; j++){
        if(mutable.includes(tilebt[j])){
          for(var k = 0; k < tilef.length; k++){
            if(movable.includes(tileft[k]) && checkMove(tilef[k], "left")){
              tilef[k].x--;
            }
          }
          if(tilef.length < 3 && (tileft.includes(bgp) || tileft.includes(bg))){
            addSprite(genas[i].x-1, genas[i].y, tilebt[j]);
          }
        }
      }
    }
  }
  checkPassive();
  for(var i = 0; i < genws.length; i++){
    var tileb = getTile(genws[i].x, genws[i].y+1);
    var tilef = getTile(genws[i].x, genws[i].y-1);
    var tilebt = tileb.map(x => x.type);
    var tileft = tilef.map(x => x.type);
    if(tilef.length < 4 && tileft.includes(sel) || tilef.length < 3 && !tileft.includes(sel)){
      for(var j = 0; j < tileb.length; j++){
        if(mutable.includes(tilebt[j])){
          for(var k = 0; k < tilef.length; k++){
            if(movable.includes(tileft[k]) && checkMove(tilef[k], "up")){
              tilef[k].y--;
            }
          }
          if(tilef.length < 3 && (tileft.includes(bgp) || tileft.includes(bg))){
            addSprite(genws[i].x, genws[i].y-1, tilebt[j]);
          }
        }
      }
    }
  }
  checkPassive();
  for(var i = 0; i < genss.length; i++){
    var tileb = getTile(genss[i].x, genss[i].y-1);
    var tilef = getTile(genss[i].x, genss[i].y+1);
    var tilebt = tileb.map(x => x.type);
    var tileft = tilef.map(x => x.type);
    if(tilef.length < 4 && tileft.includes(sel) || tilef.length < 3 && !tileft.includes(sel)){
      for(var j = 0; j < tileb.length; j++){
        if(mutable.includes(tilebt[j])){
          for(var k = 0; k < tilef.length; k++){
            if(movable.includes(tileft[k]) && checkMove(tilef[k], "down")){
              tilef[k].y++;
            }
          }
          if(tilef.length < 3 && (tileft.includes(bgp) || tileft.includes(bg))){
            addSprite(genss[i].x, genss[i].y+1, tilebt[j]);
          }
        }
      }
    }
  }
  checkPassive();
  //Rotators
  var rotcws = getAll(rotcw[0]).concat(getAll(rotcw[1])).concat(getAll(rotcw[2])).concat(getAll(rotcw[3]));
  for(var i = 0; i < rotcws.length; i++){
    var u = getTile(rotcws[i].x, rotcws[i].y-1).concat(getTile(rotcws[i].x+1, rotcws[i].y)).concat(getTile(rotcws[i].x, rotcws[i].y+1)).concat(getTile(rotcws[i].x-1, rotcws[i].y));
    for(var j = 0; j < u.length; j++){
      if(mover.includes(u[j].type)){
        u[j].type = mover[mod(mover.indexOf(u[j].type)+1, 4)];
      }else if(gen.includes(u[j].type)){
        u[j].type = gen[mod(gen.indexOf(u[j].type)+1, 4)];
      }else if(push.includes(u[j].type)){
        u[j].type = push[mod(push.indexOf(u[j].type)+1, 4)];
      }else if(slide.includes(u[j].type)){
        u[j].type = slide[mod(slide.indexOf(u[j].type)+1, 4)];
      }else if(rotcw.includes(u[j].type)){
        u[j].type = rotcw[mod(rotcw.indexOf(u[j].type)+1, 4)];
      }else if(rotccw.includes(u[j].type)){
        u[j].type = rotccw[mod(rotccw.indexOf(u[j].type)+1, 4)];
      }else if(enemy.includes(u[j].type)){
        u[j].type = enemy[mod(enemy.indexOf(u[j].type)+1, 4)];
      }
    }
  }
  var rotccws = getAll(rotccw[0]).concat(getAll(rotccw[1])).concat(getAll(rotccw[2])).concat(getAll(rotccw[3]));
  for(var i = 0; i < rotccws.length; i++){
    var u = getTile(rotccws[i].x, rotccws[i].y-1).concat(getTile(rotccws[i].x+1, rotccws[i].y)).concat(getTile(rotccws[i].x, rotccws[i].y+1)).concat(getTile(rotccws[i].x-1, rotccws[i].y));
    for(var j = 0; j < u.length; j++){
      if(mover.includes(u[j].type)){
        u[j].type = mover[mod(mover.indexOf(u[j].type)-1, 4)];
      }else if(gen.includes(u[j].type)){
        u[j].type = gen[mod(gen.indexOf(u[j].type)-1, 4)];
      }else if(push.includes(u[j].type)){
        u[j].type = push[mod(push.indexOf(u[j].type)-1, 4)];
      }else if(slide.includes(u[j].type)){
        u[j].type = slide[mod(slide.indexOf(u[j].type)-1, 4)];
      }else if(rotcw.includes(u[j].type)){
        u[j].type = rotcw[mod(rotcw.indexOf(u[j].type)-1, 4)];
      }else if(rotccw.includes(u[j].type)){
        u[j].type = rotccw[mod(rotccw.indexOf(u[j].type)-1, 4)];
      }else if(enemy.includes(u[j].type)){
        u[j].type = enemy[mod(enemy.indexOf(u[j].type)-1, 4)];
      }
    }
  }
  //Movers
  var moverws = getAll(mover[0]);
  var moverds = getAll(mover[1]);
  var moverss = getAll(mover[2]);
  var moveras = getAll(mover[3]);
  for(var i = 0; i < moverds.length; i++){
    if(checkMove(moverds[i], "right")){
      moverds[i].x++;
    }
    playTune(move);
  }
  checkPassive();
  for(var i = 0; i < moveras.length; i++){
    if(checkMove(moveras[i], "left")){
      moveras[i].x--;
    }
    playTune(move);
  }
  checkPassive();
  for(var i = 0; i < moverws.length; i++){
    if(checkMove(moverws[i], "up")){
      moverws[i].y--;
    }
    playTune(move);
  }
  checkPassive();
  for(var i = 0; i < moverss.length; i++){
    if(checkMove(moverss[i], "down")){
      moverss[i].y++;
    }
    playTune(move);
  }
  checkPassive();
}
function play(){
  step();
  tTimeout = setTimeout(play, stepTime);
}
function stop(){
  clearTimeout(tTimeout);
  tTimeout = null;
  running = false;
}
//Simulation END

//Controls START
var selection = null;
onInput("w", () => {
  getFirst(sel).y -= 1;
  if(selection) selection.y = getFirst(sel).y;
});
onInput("s", () => {
  getFirst(sel).y += 1;
  if(selection) selection.y = getFirst(sel).y;
});
onInput("a", () => {
  getFirst(sel).x -= 1;
  if(selection) selection.x = getFirst(sel).x;
});
onInput("d", () => {
  getFirst(sel).x += 1;
  if(selection) selection.x = getFirst(sel).x;
});
onInput("i", () => {
  if(!running){
    var tile = getTile(getFirst(sel).x, getFirst(sel).y);
    var types = tile.map(x => x.type);
    var grabbable = "abcdefghijklmnopqrstuvwxyz012345^&*(";
    var grabbable2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ)!@#$%)-_=";
    if(selection === null){
      if(types.includes("7")){
        for(var i = 0; i < tile.length; i++){
          if(grabbable.includes(tile[i].type)){
            tile[i].remove();
            addSprite(0, 0, grabbable2.charAt(grabbable.indexOf(tile[i].type)));
            var tile2 = getTile(0, 0);
            var types2 = tile2.map(x => x.type);
            for(var i = 0; i < tile2.length; i++){
              if(grabbable2.includes(types2[i])){
                selection = tile2[i];
                selection.x = getFirst(sel).x;
                selection.y = getFirst(sel).y;
              }
            }
          }
        }
      }
    }else{
      if(types.includes("7") && types.length < 4){
        addSprite(getFirst(sel).x, getFirst(sel).y, grabbable.charAt(grabbable2.indexOf(selection.type)));
        selection.remove();
        selection = null;
      }
    }
  }
});
onInput("j", () => {
  if(getAll(enemy[0]).concat(getAll(enemy[1])).concat(getAll(enemy[2])).concat(getAll(enemy[3])).length === 0){
    level++;
    stop();
    setMap(levels[level]);
    addMap(addLevels[level]);
    addMap(selMap);
  }else if(tTimeout !== null){
    stop();
    running = true;
  }else{
    if(selection === null && tTimeout === null){
      play();
    }
  }
});
onInput("k", () => {
  if(getAll(enemy[0]).concat(getAll(enemy[1])).concat(getAll(enemy[2])).concat(getAll(enemy[3])).length === 0){
    level++;
    setMap(levels[level]);
    addMap(addLevels[level]);
    addMap(selMap);
    running = false;
  }else{
    if(selection === null){
      step();
    }
  }
});
onInput("l", () => {
  setMap(levels[level]);
  addMap(addLevels[level]);
  addMap(selMap);
  stop();
  running = false;
});
//Controls END
